package com.tianji.aigc.memory;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import com.tianji.aigc.config.ToolResultHolder;
import com.tianji.aigc.constants.Constant;
import org.springframework.ai.chat.messages.*;
import org.springframework.stereotype.Component;

import static org.springframework.ai.chat.messages.MessageType.*;
@Component
public class MessageUtil {
    /***
     * 将Message转成RedisMessage->JSON
     */
    public static String toJson(Message message){
        //1、将当前Message的属性拷贝到RedisMessage：   RedisMessage->包含了AbstractMessage属性
        RedisMessage redisMessage = BeanUtil.toBean(message, RedisMessage.class);
        //2、手动获取textContent，并赋值给RedisMessage，textContent没有提供get方法，无法直接拷贝
        redisMessage.setTextContent(message.getText());

        //3、ToolResponseMessage||AssistantMessage  单独获取相关属性数据
        //3.1 AssistantMessage：获取toolCalls-赋值给RedisMessage
        if (message instanceof AssistantMessage assistantMessage) {
            redisMessage.setToolCalls(assistantMessage.getToolCalls());

            // 通过 messageId 获取 requestId，再通过 requestId 获取参数列表，如果有，就存储起来
            // 最后，删除 messageId 对应的数据
            var messageId = Convert.toStr(assistantMessage.getMetadata().get(Constant.ID));
            var requestId = Convert.toStr(ToolResultHolder.get(messageId, Constant.REQUEST_ID));
            var params = ToolResultHolder.get(requestId);
            if (ObjectUtil.isNotEmpty(params)) {
                redisMessage.setParams(params);
            }
            ToolResultHolder.remove(messageId);
        }
        //3.2 ToolResponseMessage：获取responses-赋值RedisMessage
        if (message instanceof ToolResponseMessage) {
            redisMessage.setToolResponses(((ToolResponseMessage) message).getResponses());
        }


        //4、将RedisMessage转成JSON字符串
        return JSONUtil.toJsonStr(redisMessage);
    }
    /***
     * JSON转成RedisMessage->ToolResponseMessage||AssistantMessage||UserMessage||SystemMessage
     */
    public static Message toMessage(String json) {
        RedisMessage redisMessage = JSONUtil.toBean(json, RedisMessage.class);
        var messageType = MessageType.valueOf(redisMessage.getMessageType());

        switch (MessageType.valueOf(redisMessage.getMessageType())) {
            case USER:
                // return new UserMessage(redisMessage.getTextContent(), redisMessage.getMedia(), redisMessage.getMetadata());
                return new MyAssistantMessage(redisMessage.getTextContent(), redisMessage.getMetadata(), redisMessage.getToolCalls(), redisMessage.getMedia());
            case ASSISTANT:
                return new AssistantMessage(redisMessage.getTextContent(), redisMessage.getMetadata(), redisMessage.getToolCalls());
            case TOOL:
                return new ToolResponseMessage(redisMessage.getToolResponses(), redisMessage.getMetadata());
            case SYSTEM:
                return new AssistantMessage(redisMessage.getTextContent()); // 可能应为 SystemMessage
        }
        throw new RuntimeException("不支持的消息类型");
    }
}
